/**
 * This file is part of Opintopaivakirja.
 *
 * Opintopaivakirja is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Opintopaivakirja is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Opintopaivakirja.  If not, see <http://www.gnu.org/licenses/>.
 */
package opintopaivakirja;

import java.sql.PreparedStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 * Luokka toteuttaa järjestelmään palvelut, jotka tarvitaan
 * Muistiinpanojen merkitsemiseen tageilla.
 * 
 * @author Teemu Jonkkari
 * @version 1.0
 */
public class Tagi {

    private String sana;

    /**
     * Oletusmuodostin
     */
    public Tagi() {
    }

    /**
     * Muodostin, jolla voidaan asettaa suoraan tagin sana.
     *
     * @param sana merkkijono, jota käytetään tagina.
     */
    public Tagi(String sana) {
        this.sana = sana;
    }

    /**
     * Metodilla voidaan hakea muistiinpanon tagit tietokannasta.
     *
     * @param muistiinpanoid Muistiinpanon id-tunniste
     * @return ArrayList, jossa löydetyt tagit.
     */
    public ArrayList<Tagi> selectMuistiinpanonTagit(int muistiinpanoid) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        ArrayList<Tagi> tag = new ArrayList<Tagi>();

        try {
            conn = new Tietokanta().getYhteys();

            ps = conn.prepareStatement("" +
                    "SELECT SANA " +
                    "FROM OPINTOPAIVAKIRJA.TAGI " +
                    "WHERE MUISTIINPANO_ID = ? ORDER BY SANA");
            ps.setInt(1, muistiinpanoid);

            rs = ps.executeQuery();

            while (rs.next()) {
                Tagi t = new Tagi(rs.getString("sana"));
                tag.add(t);
            }

        } catch (SQLException ex) {
            Virheenkasittely.getInstance().setVirhe(Tietokanta.class.getName(), ex);
        } catch (NullPointerException e) {
            Virheenkasittely.getInstance().setVirhe(Tietokanta.class.getName(), e);
        } finally {
            if (ps != null) {
                try {
                    ps.close();
                    ps = null;
                } catch (SQLException ex) {
                    Virheenkasittely.getInstance().setVirhe(Tietokanta.class.getName(), ex);
                }
            }

            if (rs != null) {
                try {
                    rs.close();
                    rs = null;
                } catch (SQLException ex) {
                    Virheenkasittely.getInstance().setVirhe(Tietokanta.class.getName(), ex);
                }
            }
            return tag;
        }
    }

    /**
     * Metodilla voidaan hakea kayttajan tagit tietokannasta.
     *
     * @param kayttajaid Käyttäjän id-tunniste, joka omistaa tagit.
     * @return ArrayList, jossa löydetyt tagit.
     */
    public ArrayList<Tagi> selectKayttajanTagit(int kayttajaid) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        ArrayList<Tagi> tag = new ArrayList<Tagi>();

        try {
            conn = new Tietokanta().getYhteys();

            ps = conn.prepareStatement("" +
                    "SELECT DISTINCT T.SANA " +
                    "FROM OPINTOPAIVAKIRJA.TAGI T, " +
                    "OPINTOPAIVAKIRJA.PROJEKTI_HAS_MUISTIINPANO PM, " +
                    "OPINTOPAIVAKIRJA.PROJEKTI P " +
                    "WHERE T.MUISTIINPANO_ID = PM.MUISTIINPANO_ID " +
                    "AND PM.PROJEKTI_ID = P.ID AND P.KAYTTAJA_ID = ? " +
                    "ORDER BY SANA ASC");
            ps.setInt(1, kayttajaid);

            rs = ps.executeQuery();

            while (rs.next()) {
                Tagi t = new Tagi(rs.getString("sana"));
                tag.add(t);
            }

        } catch (SQLException ex) {
            Virheenkasittely.getInstance().setVirhe(Tietokanta.class.getName(), ex);
        } catch (NullPointerException e) {
            Virheenkasittely.getInstance().setVirhe(Tietokanta.class.getName(), e);
        } finally {
            if (ps != null) {
                try {
                    ps.close();
                    ps = null;
                } catch (SQLException ex) {
                    Virheenkasittely.getInstance().setVirhe(Tietokanta.class.getName(), ex);
                }
            }

            if (rs != null) {
                try {
                    rs.close();
                    rs = null;
                } catch (SQLException ex) {
                    Virheenkasittely.getInstance().setVirhe(Tietokanta.class.getName(), ex);
                }
            }
            return tag;
        }
    }

    /**
     * Metodilla voidaan lisätä tagi tietokantaan.
     *
     * @param muistiinpanoid Tagin omistavan muistiinanon id-tunniste.
     * @param tagi Tagi, joka lisätään tietokantaan.
     */
    public void insertTagi(int muistiinpanoid, Tagi tagi) {
        Connection conn = null;
        PreparedStatement ps = null;

        try {
            conn = new Tietokanta().getYhteys();

            ps = conn.prepareStatement("" +
                    "INSERT INTO OPINTOPAIVAKIRJA.TAGI " +
                    "(MUISTIINPANO_ID, SANA) VALUES (?, ?)");
            ps.setInt(1, muistiinpanoid);
            ps.setString(2, tagi.sana);

            ps.executeUpdate();

        } catch (SQLException ex) {
            Virheenkasittely.getInstance().setVirhe(Tietokanta.class.getName(), ex);
        } finally {
            if (ps != null) {
                try {
                    ps.close();
                    ps = null;
                } catch (SQLException ex) {
                    Virheenkasittely.getInstance().setVirhe(Tietokanta.class.getName(), ex);
                }
            }
        }
    }

    /**
     * Metodilla voidaan poistaa muistiinpanoon kuuluvat tagit tietokannasta.
     *
     * @param muistiinpanoid Tagin omistavan muistiinanon id-tunniste.
     */
    public void deleteTagit(int muistiinpanoid) {
        Connection conn = null;
        PreparedStatement ps = null;

        try {
            conn = new Tietokanta().getYhteys();
            ps = conn.prepareStatement("" +
                    "DELETE FROM OPINTOPAIVAKIRJA.TAGI " +
                    "WHERE MUISTIINPANO_ID = ?");
            ps.setInt(1, muistiinpanoid);

            ps.executeUpdate();

        } catch (SQLException ex) {
            Virheenkasittely.getInstance().setVirhe(Tietokanta.class.getName(), ex);
        } finally {
            if (ps != null) {
                try {
                    ps.close();
                    ps = null;
                } catch (SQLException ex) {
                    Virheenkasittely.getInstance().setVirhe(Tietokanta.class.getName(), ex);
                }
            }
        }
    }

    /**
     * @return the sana
     */
    public String getSana() {
        return sana;
    }

    /**
     * @param sana the sana to set
     */
    public void setSana(String sana) {
        this.sana = sana;
    }
}

